;; 这是基本编辑的一些配置，拷贝至其他人的配置，并添加了一些自己的配置，没有逐一测试作用
;; 这个配置还有待改善

(require-package 'unfill)

(when (fboundp 'electric-pair-mode)
  (add-hook 'after-init-hook 'electric-pair-mode))
(add-hook 'after-init-hook 'electric-indent-mode)

(maybe-require-package 'list-unicode-display)

;; emacs中可以使用鼠标copy的文字
(setq mouse-drag-copy-region t)

;; 设置默认编码
(set-language-environment "UTF-8")
(set-default-coding-systems 'utf-8)
(set-clipboard-coding-system 'utf-8)

;; 将yes/on询问更改为y/n询问
(fset 'yes-or-no-p 'y-or-n-p)

;; 在行首C-k时，同时删除该行
(setq-default kill-whole-line t)

;;关闭光标闪烁
(blink-cursor-mode 0)

;;高亮显示当光标所在行
(global-hl-line-mode t)

;; some default value
(setq-default
 ;; 下面两个变量设置光标闪烁，需要打开光标闪烁模式才有效
 blink-cursor-delay 0
 blink-cursor-interval 0.4
 ;; 设置默认TAB键显示长度
 default-tab-width 2
 ;; 设置菜单栏中，显示的最大长度
 buffers-menu-max-size 20
 ;case-fold-search t
 ;; 状态栏显示行/列
 line-number-mode t ;; 显示光标行坐标
 column-number-mode t ;; 显示光标列坐标
 ;grep-scroll-output t
 ;delete-selection-mode t
 ;;设置额外的行间距
 line-spacing 0.2
 ;; 取消emacs自动备份文件
 make-backup-files nil
 ;mouse-yank-at-point t
 ;save-interprogram-paste-before-kill t
 ;set-mark-command-repeat-pop t
 ;show-trailing-whitespace t
 ;tooltip-delay 1.5
 ;; 自动换行
 truncate-lines nil
 truncate-partial-width-windows nil
 ;; 闪烁屏幕提示警告关闭
 visible-bell nil)

;;关于缩进调整
(setq standard-indent 2
      ;; 缩进时不使用tab
      indent-tabs-mode nil
      tab-width 2)

;; 设置滚动条显示和光标位置等
(setq scroll-preserve-screen-position 'always
 scroll-step 1
 scroll-margin 3
 scroll-conservatively 10000)

;; 配置显示界面，仅对x界面有效
(if (display-graphic-p)
    (progn
      ;; 显示右边的滚动条
      (set-scroll-bar-mode t)
      ;; 隐藏菜单栏,设置为1打开
      (menu-bar-mode 0)
      ;; 隐藏工具栏,设置为1打开
      (tool-bar-mode 0)))

;; 在其它编辑器中改变文件内容时，emacs中自动更新文件
(global-auto-revert-mode)
(setq global-auto-revert-non-file-buffers t;;buffer活跃时才更新内容
      auto-revert-verbose t);;file内容更新时有提示信息

;; 记录最近打开的文件(在file菜单栏中)
(setq recentf-max-saved-items 500
      recentf-exclude '("/tmp/" "/ssh:"))
(recentf-mode t)

;; 使用一个更酷的mode-line
(require-package 'smart-mode-line)
;;以下是选用不同的主题
(setq sml/theme 'automatic)
;;(setq sml/theme 'dark)
;;(setq sml/theme 'light)
;;(setq sml/theme 'respectful)
;; 阻止每次启动时确认
(setq sml/no-confirm-load-theme t)
(sml/setup)

;; 在mode-line显示时间和日期
(setq display-time-format "%Y/%m/%d-%H:%M <%w>")
(setq display-time-interval 1);;modeline中时间每秒钟更新一次
(display-time-mode t);;modeline中显示时间
;; 在mode-line显示电池电量
(display-battery-mode t)

;; 窗口切换插件
(require-package 'switch-window)
(global-set-key (kbd "C-x o") 'switch-window)
(global-set-key (kbd "C-x 1") 'delete-other-window)

(defun other-window-backward (&optional n)
  "Select the Nth previous window"
  (interactive "P")
  (other-window (- (prefix-numeric-value n))))
(global-set-key "\C-xp" 'other-window-backward)

; 操作无限回退插件
(require-package 'undo-tree)
(global-set-key "\C-xu" 'undo-tree-visualize)
(global-undo-tree-mode t)
(diminish 'undo-tree-mode)

;; 显示左边行号插件
;; 开启左边显示行号后，org-mode打开大文件时会卡顿，所以关闭
;;(require-package 'hlinum)
;;(hlinum-activate)
;;(global-linum-mode t)
;; 由于hlinum引起卡顿，使用nlinum显示行号
(require-package 'nlinum)
;; 显示行号
(defun lugg/show-line-number ()
  (interactive)
  (nlinum-mode t))
;; 隐藏行号
(defun lugg/hide-line-number ()
  (interactive)
  (nlinum-mode 0))
(global-set-key "\C-cvs" 'lugg/show-line-number)
(global-set-key "\C-cvh" 'lugg/hide-line-number)

;; visual line
(global-visual-line-mode t)
;; (diminish 'global-visual-line-mode)
(diminish 'visual-line-mode)

;; expand-region
(require-package 'expand-region)
(global-set-key (kbd "C-=") 'er/expand-region)
;; enable uppercase and lowercase transform for region
(put 'upcase-region 'disabled nil)
(put 'downcase-region 'disabled nil)

;; whole-line-or-region-mode
(require-package 'whole-line-or-region)
;(whole-line-or-region-mode t)
(diminish 'whole-line-or-region-mode)
(make-variable-buffer-local 'whole-line-or-region-mode)

;; enable cua mode without prefix key
(cua-selection-mode t)

;; use page-break-line to handle the ^L page-breaking symbol
(require-package 'page-break-lines)
(global-page-break-lines-mode)
(diminish 'page-break-lines-mode)

(require-package 'fuzzy)
(require-package 'popup)
(require-package 'pos-tip)

;; 添加minibuf中自动补全等相关配置
(require 'init-ido)
;; 添加hex文件模式支持
(require 'hexview-mode)
(setq auto-mode-alist
      (append
       '(("\\.hex\\'" . hexview-mode))
       '(("\\.bin\\'" . hexview-mode))
       auto-mode-alist))
;; M-x hexview-find-file 只读方式打开一个hex文件

;; 提供一个在文档中快速跳转的模式
;; 调用该模式后要求输入一个字符，然后所有首字母为输入字符的单词的首字母被标记
;; 为a-z的字符，此时安a-z字符，光标跳转到对应的单词上
(require-package 'ace-jump-mode)

;; 一个弹出窗口管理器。
;; 提供更方便查看帮助的功能，"C-h *"弹出窗口时，关闭移动到弹出窗口等功能。
(require-package 'popwin)
(setq display-buffer-function 'popwin:display-buffer)

;; 语法检测
(require-package 'flycheck)

(provide 'init-base-edit)
